﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using fideeraSoft.DAO;
using fideeraSoft.Utils;
using fideeraSoft.DAOimpl;
using System.Data.SqlClient;
using fideeraSoft.Entities;
using System.Data;

namespace fideeraSoft.DAOimpl
{
    public class ProveedorDAOSQLimpl : ProveedorDAO
    {

        #region PRoveedor ALTA
        public void altaProveedor(Entities.Proveedor proveedor)
        {
            SqlConnection conn = null;
            try
            {
                conn=SQLclass.conectarSQL();
                conn.Open();

                string query = "SET IDENTITY_INSERT Proveedor ON; INSERT INTO Proveedor (ID,razonSocial,responsable,cuil,direccion,localidad,provincia,telefono,celular) VALUES (@IdProveedor,@RazonSocial,@Responsable,@Cuil,@Direccion,@Localidad,@Provincia,@Telefono,@Celular)";
                //string query = "INSERT INTO Proveedor (razonSocial,responsable,cuil,direccion,localidad,provincia,telefono,celular) VALUES (@RazonSocial,@Responsable,@Cuil,@Direccion,@Localidad,@Provincia,@Telefono,@Celular)";
                SqlCommand cmd = new SqlCommand(query, conn);
                
                cmd.Parameters.AddWithValue("@IdProveedor",proveedor.IdProveedor);
                cmd.Parameters.AddWithValue("@RazonSocial", proveedor.RazonSocial);
                cmd.Parameters.AddWithValue("@Responsable", proveedor.Responsable);
                cmd.Parameters.AddWithValue("@Cuil", proveedor.Cuil);
                cmd.Parameters.AddWithValue("@Direccion", proveedor.Direccion);
                cmd.Parameters.AddWithValue("@Localidad", proveedor.Localidad);
                cmd.Parameters.AddWithValue("@Provincia", proveedor.Provincia);
                cmd.Parameters.AddWithValue("@Telefono", proveedor.Telefono);
                cmd.Parameters.AddWithValue("@Celular", proveedor.Celular);
                
                cmd.ExecuteNonQuery();
               //cmd.Parameters.Clear();
               // cmd.CommandText = "SELECT @@IDENTITY";
               // int insertID=Convert.ToInt32(cmd.ExecuteScalar());

             //  cmd.Dispose();
                cmd=null;

                //cmd.Connection.Close();
                /*DataTable dt = new DataTable();
                DA.Fill(dt);
                */
            }
            catch (Exception e)
            {
                CLogger.Append("[altaProveedor] Exception alta: "+e, CLogger.ERROR);      //DEBUG
                throw new MiException("[altaProveedor] Exception alta: "+e);
            }
            finally 
            {
                conn.Close();
            }
            
        }
        #endregion

        #region OBTENER LISTA DE PROVEEDORES
        public List<Proveedor> obtenerListaProveedoresEnBD()
        {
            SqlConnection conn = SQLclass.conectarSQL();
            List<Proveedor> listProveedor = null;

            try
            {                
                conn.Open();

                string query = "SELECT * FROM Proveedor";
                SqlCommand cmd = new SqlCommand(query, conn);
                

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    listProveedor = new List<Proveedor>();


                    while (reader.Read())
                    {
                        Proveedor prov = new Proveedor();

                        prov.IdProveedor = reader.GetInt32(0);
                        prov.RazonSocial = reader.GetString(1);
                        prov.Responsable = reader.GetString(2);
                        prov.Cuil = reader.GetString(3);
                        prov.Direccion = reader.GetString(4);
                        prov.Localidad = reader.GetString(5);
                        prov.Provincia = reader.GetString(6);
                        prov.Telefono = reader.GetString(7);
                        prov.Celular = reader.GetString(8);

                        //CLogger.Append("[obtenerListaProveedoresEnBD] DATOS DEL PROV: ID: "+prov.IdProveedor +" RS: " +prov.RazonSocial, CLogger.INFO);      //DEBUG

                        listProveedor.Add(prov);
                    }

                }
                else
                {
                    listProveedor = null;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[obtenerListaProveedoresEnBD] Exception obtener lista: " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[obtenerListaProveedoresEnBD] Exception obtener lista: " + e);
            }
            finally
            {
                conn.Close();
            }
            return listProveedor;
        }
        #endregion

        #region BAJA DE PROVEEDOR
        public void bajaProveedor(Entities.Proveedor proveedor)
        {
            throw new NotImplementedException();
        }
        #endregion

        #region BUSCAR PROVEEDOR POR CUIL
        public Proveedor buscarProveedorPorCuil(string cuil)
        {
            Proveedor prov = null;
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "SELECT * FROM Proveedor WHERE cuil='"+cuil+"'";
                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    prov = new Proveedor();
                    while (reader.Read())
                    {
                        prov.IdProveedor = reader.GetInt32(0);
                        prov.RazonSocial = reader.GetString(1);
                        prov.Responsable = reader.GetString(2);
                        prov.Cuil = reader.GetString(3);
                        prov.Direccion = reader.GetString(4);
                        prov.Localidad = reader.GetString(5);
                        prov.Provincia = reader.GetString(6);
                        prov.Telefono = reader.GetString(7);
                        prov.Celular = reader.GetString(8);
                        //  CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] ID : " + ID, CLogger.ERROR);      //DEBUG
                    }
                    
                }
                else
                {
                    prov = null;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[buscarProveedorPorCuil] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[buscarProveedorPorCuil] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG
            return prov;
        }
        #endregion

        public Proveedor buscarProveedorPorId(int id)
        {
            throw new NotImplementedException();
        }
        public Proveedor buscarProveedorPorRazonSocial(string razonSocial)
        {
            throw new NotImplementedException();
        }


        #region BUSCAR ULTIMO ID DE PROVEEDOR
        public int buscarNuevoUltimoIdProveedorEnBD()
        {
            int ID = 0;
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "SELECT TOP 1 ID FROM Proveedor ORDER BY ID DESC ";
                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    
                    while (reader.Read())
                    {                        
                        ID= reader.GetInt32(0);
                      //  CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] ID : " + ID, CLogger.ERROR);      //DEBUG
                    }
                    ID ++;
                }
                else
                {
                    ID = 1;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[buscarNuevoUltimoIdProveedorEnBD] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
           // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG
            return ID;
        }

        #endregion


        #region Eliminar PROVEEDOR POR ID

        public void eliminarProveedorPorId(int id)
        {
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "DELETE FROM Proveedor WHERE ID=" + id.ToString();
                SqlCommand cmd = new SqlCommand(query, conn);
                cmd.ExecuteNonQuery();

            }
            catch (Exception e)
            {
                CLogger.Append("[eliminarProveedorPorId] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[eliminarProveedorPorId] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
        }
        #endregion


        #region Eliminar TODOS LOS PROVEEDORES EN DB

        public void eliminarTodosLosProveedoresEnDb()
        {
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "DELETE FROM Proveedor" ;
                SqlCommand cmd = new SqlCommand(query, conn);
                cmd.ExecuteNonQuery();

            }
            catch (Exception e)
            {
                CLogger.Append("[eliminarTodosLosProveedoresEnDb] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[eliminarTodosLosProveedoresEnDb] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
        }
        #endregion
    }
}
